<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<!-- 通过状态模式，完成超级玛丽的跳跃、奔跑、射击、蹲下动作 -->
		<script type="text/javascript">
			class MarryState{
				constructor() {
				    // 1.当前状态
					this.currentState={}
					// 2.每个状态下的动作
					this.states={
						jump:()=>{
							console.log('跳跃')
						},
						move:()=>{
							console.log("移动")
						},
						shoot:()=>{
							console.log("射击")
						},
						squat:()=>{
							console.log("蹲下")
						}
					}
				}
				// 改变状态
				changeState(...args){
					// 组合动作,通过传递多个参数实现
					let arg = args;
					// 重置内部状态
					this.currentState = {}
					// 如果有动作，添加动作，
					if(arg.length){
						// 遍历动作
						arg.forEach(item=>{
							// 向内部状态添加动作
							this.currentState[item]=true
						})
						console.log('改变状态：')
					}
					return this;
				}
				// 执行动作
				runAction(){
					// 遍历内部状态保存的动作
					for(let key in this.currentState){
						this.currentState[key] && this.states[key]()
					}
					return this
				}
			}
			let marry = new MarryState()
			marry.changeState('squat','shoot').runAction()
			marry.changeState('jump','squat').runAction()
		</script>
	</body>
</html>
